#ifndef AFD_H_
#define AFD_H_

#include "AFND.h"
#include <set>
#include <map>
#include <iostream>
using namespace std;

class AFD {

    public:
        AFD(set<char> &alfabeto);
        AFD(const AFND &);
        virtual ~AFD();

        int inicial() const;
        set<char> alfabeto() const;
        set<int> finales() const;
        int sigma(int, char);

        int esEstado(int);
        int esFinal(int);
        int enAlfabeto(char);
        int acepta(string);

        int nuevoEstado();
        int hacerFinal(int);
        int agregarTransicion(int origen, char caracter, int destino);

        friend ostream& operator<<(ostream &, AFD &);

    private:
        bool interseccionVacia(set<int> first, set<int> second);

        class EstadoCaracter {
            public:
                int _estado;
                char _caracter;

                EstadoCaracter(int e, char c) : _estado(e), _caracter(c) {}

                friend bool operator<(const EstadoCaracter& eyc1,
                                      const EstadoCaracter& eyc2) {
                    return eyc1._estado < eyc2._estado ||
                           (eyc1._estado == eyc2._estado &&
                            eyc1._caracter < eyc2._caracter);
                }

                friend bool operator==(const EstadoCaracter& eyc1,
                                       const EstadoCaracter& eyc2) {
                    return eyc1._estado == eyc2._estado &&
                           eyc1._caracter == eyc2._caracter;
                }

        };
        typedef map<EstadoCaracter, int> mapTransicion;

        set<char> _alfabeto;
        set<int> _estados;
        int _ultimo;
        int _inicial;
        set<int> _finales;
        mapTransicion _transiciones;
};

#endif /* AFD_H_ */
